<?php // $Id: sharpobj_data_base.php,v 1.2 2006/01/12 18:43:55 alex Exp $

/**
 * Интерфейс элемента данных
 *
 */
interface sharpobj_data_interface_item
{ 
    // Работа с данными
    function get($view,$datapath=null,$opt=null);
    function set($view,$data=null,$datapath=null,$opt=null);
    function clear($datapath=null);
    
    // Функции для упрощения работы со стандартным представлением
    function getP($datapath=null,$opt=null);
    function setP($data=null,$datapath=null,$opt=null);
    /**
     * Возвращает тип элемента
     *
     * @param string $datapath - путь к элементу
     */
    function type($datapath=null);
    // Проверка свойств
    function isError($datapath=null);
    function isNull($datapath=null);
    function isEmpty($datapath=null);
    function isDefault($datapath=null);
    function isNoData($datapath=null);
    function isData($datapath=null);
    function getErrorCode();
    function getErrorOpt();
    // Управление параметрами обработки
    function getDefaultValue();
    function setDefaultValue($data);
    function getNullValue();
    function setNullValue($data);
    function getOption($name);
    function setOption($name,$value);
    function unsetOption($name);
    function isOptionSet($name);
    // Служебные функции обработки путей к вложенным элементам
    function pathThis($datapath=null);
    function pathNextLast($datapath=null);
    function pathNextName($datapath=null);
    function pathNextPath($datapath=null);
}
/**
 * Базовые функции, необходимые для реализации элемента, не зависящие от реализации
 *
 */
abstract class sharpobj_data_baseitem
{
    // **********
    // Функции работы с путями
    // **********
    /**
     * Проверка: указывает ли путь на текущий элемент
     *
     * @param string $datapath
     * @return bool
     */
    function pathThis($datapath=null)
    {
        // Путь указываем на текущий объект, а не на вложенный
        return is_null($datapath) OR ''==$datapath;
    }
    /**
     * Проверка: указывает ли путь на вложенный элемент первого уровня
     *
     * @param string $datapath
     * @return bool
     */
    function pathNextLast($datapath=null)
    {
        // Путь указываем на вложенный объект первого уровня
        if ($this->pathThis($datapath))
        {   // Путь указывает на текущий элемент
            return false;
        }
        return (strpos($datapath,'/')===false);
    }
    /**
     * Возвращает имя следующего вложенного элемента
     *
     * @param string $datapath
     * @return bool
     */
    function pathNextName($datapath=null)
    {
        // Имя вложенного элемента
        if ($this->pathThis($datapath))
        {   // Путь указывает на текущий элемент
            return null;
        }
        $path = explode('/',$datapath);
        return $path[0];
    }
    /**
     * Возвращает путь для следующего элемента
     *
     * @param string $datapath
     * @return bool
     */
    function pathNextPath($datapath=null)
    {
        // Путь, переданный следующему элементу
        if ($this->pathThis($datapath))
        {   // Путь указывает на текущий элемент
            return null;
        }
        $path = explode('/',$datapath);
        unset($path[0]);
        if (count($path)==0){return null;}
        return implode('/',$path);
    }
}
?>